package controle.redeNeural;

public class MetodosAuxiliares {
	
	public static int binaryDoubleToInt(double valores []){
		int valor = 0;
		int potencia = 0;
		for (int i = (valores.length-1); i >=0 ; i--) {
			valor += (int) (Math.pow(2, potencia)*valores[i]);
			potencia++;
		}
		return valor;
	}
	
	public static double [] toBinaryDouble2(int numero){
		double [] number;
//		int tamanhoVetor = (int) ceil(sqrt(numero));
		int tamanhoVetor = 2;
		number = new double[tamanhoVetor];
		
		int indiceVetor = tamanhoVetor-1;
		
		while(numero != 0 && indiceVetor >= 0){
			number[indiceVetor] = numero%2;
			numero /= 2;
			indiceVetor--;
		}
		return number;
	}
	
	/**
	 * Tenta achar uma coluna para o jogador passar
	 * @return
	 */
	
	public static int acharColunaVaziaAvancar(int posicaoJogador, int [] posicaoJogadores){
	    //varre a lista e procura a posição mais próxima daonde o jogador está
	    //que esteja disponível para ele passar
		//Coluna com preferência pra ser usada
		int colunaFavorita = posicaoJogador%4;
		
		if(colunaDisponivelAvancar(posicaoJogadores, posicaoJogador, colunaFavorita))
		{
			return colunaFavorita;
		}
		
		int colunaSuperior = colunaFavorita+1;
		int colunaInferior = colunaFavorita-1;
		
	    //seleciona uma coluna favorita aleatoriamente
		double rand = Math.random();
		
		if(rand <= 0.33)
		{
			colunaFavorita = colunaSuperior;
		}
		else if(rand <= 0.66 && rand > 0.33)
		{
			colunaFavorita = colunaInferior;
		}
		else
		{
			//é a própria
		}
		
		while(colunaSuperior <= 3 || colunaInferior >= 0)
		{
			//Aqui também os pesos são aleatórios
			if(rand > 0.5){
				if(colunaDisponivelAvancar(posicaoJogadores,posicaoJogador,colunaSuperior) && colunaSuperior <=3){
					return colunaSuperior;
				}
			}
			else{
				if(colunaDisponivelAvancar(posicaoJogadores,posicaoJogador,colunaInferior) && colunaInferior >= 0){
					return colunaInferior;
				}
			}
			colunaSuperior++;
			colunaInferior--;
		}
		
		//Caso não dê certo, vai pela mais próxima mesmo.		
		return colunaFavorita;		
	}
	
	public static boolean colunaDisponivelAvancar(int [] posicaoJogadores, int posicaoJogador, int colunaFavorita){
		for (int posicaoAdversario : posicaoJogadores) {
			if(posicaoAdversario%4 == colunaFavorita && 
					((posicaoAdversario/4)-1) == (posicaoJogador/4))
			{
				return false;
			}
		}
		return true;
	}
	
	/**
	 * Tenta achar uma coluna para o jogador passar
	 * @return
	 */
	
	public static int acharColunaVaziaRetornar(int posicaoJogador, int [] posicaoJogadores){
	    //varre a lista e procura a posição mais próxima daonde o jogador está
	    //que esteja disponível para ele passar
		//Coluna com preferência pra ser usada
		int colunaFavorita = posicaoJogador%4;
		
		if(colunaDisponivelRetornar(posicaoJogadores, posicaoJogador, colunaFavorita))
		{
			return colunaFavorita;
		}
		
		int colunaSuperior = colunaFavorita+1;
		int colunaInferior = colunaFavorita-1;
		
		//seleciona uma coluna favorita aleatoriamente
		double rand = Math.random();
		
		if(rand <= 0.33)
		{
			colunaFavorita = colunaSuperior;
		}
		else if(rand <= 0.66 && rand > 0.33)
		{
			colunaFavorita = colunaInferior;
		}
		else
		{
			//é a própria
		}
		
		while(colunaSuperior <= 3 || colunaInferior >= 0)
		{
			if(rand > 0.5)
			{
				if(colunaDisponivelRetornar(posicaoJogadores,posicaoJogador,colunaSuperior) && colunaSuperior <=3){
					return colunaSuperior;
				}
			}
			else{
				if(colunaDisponivelRetornar(posicaoJogadores,posicaoJogador,colunaInferior) && colunaInferior >= 0){
					return colunaInferior;
				}
			}
			colunaSuperior++;
			colunaInferior--;
		}
		
		//Caso não dê certo, vai pela mais próxima mesmo.		
		return colunaFavorita;		
	}
	
	public static boolean colunaDisponivelRetornar(int [] posicaoJogadores, int posicaoJogador, int colunaFavorita){
		for (int posicaoAdversario : posicaoJogadores) {
			if(posicaoAdversario%4 == colunaFavorita && 
					((posicaoAdversario/4)+1) == (posicaoJogador/4))
			{
				return false;
			}
		}
		return true;
	}
	
}
